/**
 * 小程序部署脚本
 * 用于自动上传代码到微信小程序平台
 */

const path = require('path');
const fs = require('fs');
const chalk = require('chalk');
const ci = require('miniprogram-ci');
const pkg = require('../package.json');

// 检查是否提供了必要的参数
const args = process.argv.slice(2);
const isHelp = args.includes('--help') || args.includes('-h');
const isVersion = args.includes('--version') || args.includes('-v');
const isPreview = args.includes('--preview') || args.includes('-p');
const isUpload = args.includes('--upload') || args.includes('-u');
const version = args.find(arg => /^--version=.+/.test(arg))?.split('=')[1] || pkg.version;
const desc = args.find(arg => /^--desc=.+/.test(arg))?.split('=')[1] || `版本发布 ${version}`;

// 显示帮助信息
if (isHelp) {
  console.log(chalk.cyan('微信小程序部署工具\n'));
  console.log('用法: node scripts/deploy.js [options]\n');
  console.log('选项:');
  console.log('  -h, --help               显示帮助信息');
  console.log('  -v, --version            显示版本信息');
  console.log('  -p, --preview            生成预览版本');
  console.log('  -u, --upload             上传代码');
  console.log('      --version=<version>  指定版本号 (默认使用 package.json 中的版本)');
  console.log('      --desc=<description> 指定版本描述');
  process.exit(0);
}

// 显示版本信息
if (isVersion) {
  console.log(`v${pkg.version}`);
  process.exit(0);
}

// 检查必须的操作
if (!isPreview && !isUpload) {
  console.log(chalk.red('❌ 错误: 请指定操作 (--preview 或 --upload)'));
  console.log('使用 --help 查看帮助信息');
  process.exit(1);
}

// 检查私钥文件
const privateKeyPath = path.resolve(__dirname, '../config/private.key');
if (!fs.existsSync(privateKeyPath)) {
  console.log(chalk.red('❌ 错误: 未找到私钥文件'));
  console.log('请将微信小程序代码上传私钥放置在 config/private.key');
  process.exit(1);
}

// 检查项目配置文件
const projectConfigPath = path.resolve(__dirname, '../project.config.json');
if (!fs.existsSync(projectConfigPath)) {
  console.log(chalk.red('❌ 错误: 未找到项目配置文件'));
  console.log('请确保项目根目录下存在 project.config.json 文件');
  process.exit(1);
}

// 读取项目配置
const projectConfig = require(projectConfigPath);
const { appid } = projectConfig;

if (!appid) {
  console.log(chalk.red('❌ 错误: 项目配置中未找到 appid'));
  console.log('请在 project.config.json 中设置 appid');
  process.exit(1);
}

// 定义项目
const project = new ci.Project({
  appid,
  type: 'miniProgram',
  projectPath: path.resolve(__dirname, '../dist'),
  privateKeyPath,
  ignores: ['node_modules/**/*'],
});

// 主函数
async function main() {
  console.log(chalk.blue('🚀 开始部署微信小程序...\n'));
  
  try {
    // 预览版本
    if (isPreview) {
      console.log(chalk.yellow('📱 正在生成预览版本...\n'));
      
      const previewResult = await ci.preview({
        project,
        version,
        desc,
        setting: {
          es6: true,
          minify: true,
        },
        qrcodeFormat: 'base64',
        qrcodeOutputDest: path.resolve(__dirname, '../dist/preview.png'),
      });
      
      console.log(chalk.green('✅ 预览版本生成成功!'));
      console.log(`预览二维码已保存到: ${path.resolve(__dirname, '../dist/preview.png')}`);
      
      if (previewResult.base64) {
        console.log('\n预览二维码 Base64:');
        console.log(previewResult.base64);
      }
    }
    
    // 上传代码
    if (isUpload) {
      console.log(chalk.yellow('📤 正在上传代码...\n'));
      
      const uploadResult = await ci.upload({
        project,
        version,
        desc,
        setting: {
          es6: true,
          minify: true,
        },
        onProgressUpdate: console.log,
      });
      
      console.log(chalk.green('\n✅ 代码上传成功!'));
      console.log(`版本: ${version}`);
      console.log(`描述: ${desc}`);
      console.log(`上传时间: ${new Date().toLocaleString()}`);
      console.log('\n请前往微信小程序管理后台设置体验版或提交审核');
    }
  } catch (error) {
    console.error(chalk.red('\n❌ 部署失败:'), error);
    process.exit(1);
  }
}

// 执行主函数
main(); 